// encoding utf-8
#ifndef __QyRenderItem__
#define __QyRenderItem__

#include <QtCore/QUuid>
#include <QtCore/QRectF>

namespace QyRender {

class ItemGeometry;
class Layer;

/*! \brief Элемент для отрисовки. Базовый, абстрактный, полиморфный класс для любого элемента который может(должен) быть нарисован на сцене.
    \ingroup RenderCore

    Каждый элемент привязывается к конкретному слою (см QyRender::Layer). Если слой для элемента не
    задан, то элемент отрисован не будет.
*/
class Item {
public:
    //! Режимы рисования элемента
    enum PaintMode {
        DefaultPaint,   //!< Обычный режим рисования
        BasicPaint      //!< Упрощенный способ рисования, используеться для режима выбора. В этом режиме не следует посылать на конвеер инструкции текстурирования, установки текстурных координат, нормалей и т.д.
    };

    explicit Item( QyRender::Layer * layer = 0 );
    virtual ~Item();

    virtual quint32 type() const { return 0; } //!< Тип элемента. Неиспользуеться. Метод можно переопределить и использовать по своему усмотрению.
    virtual QUuid serial() const { return p_serial; } //!< Серийный номер. Уникальный номер элемента
    const QyRender::Layer * layer() const { return p_layer; } //!< слой к которому привязан элемент
    virtual QRectF boundingRect() const = 0; //!< Обрамляющий объект прямоугольник.
    virtual QyRender::ItemGeometry geometry() const = 0; //!< Обрамляющий объект полигон.

    virtual void paint( const PaintMode & mode = DefaultPaint ) = 0; //!< Нарисовать объект.
    void setLayer( QyRender::Layer * layer ); //!< установить слой
    void setSerial( const QUuid & serial ) { p_serial = serial; }
    virtual void move( const QPointF & pos ) = 0;

private:
    virtual void layerChanged( QyRender::Layer * oldLayer, QyRender::Layer * newLayer )
        { Q_UNUSED(oldLayer); Q_UNUSED(newLayer); } //!< Метод вызывается при смене слоя для объекта. Если слой был передан в конструктор, то метод вызван НЕ будет.

    Layer * p_layer; // Слой к которому привязан элемент.
    QUuid p_serial; // Серийный номер элемента.

};

};

#endif//__QyRenderItem__
